var express = require('express')
var router = express.Router()
const bcrypt = require('bcrypt'); //  加密数字的模块
// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
    console.log('Time: ', Date.now())
    //模块路由中检测是否携带了 token
    if (!req.auth) {
        return res.send({
            status: 403,
            message: "缺少token"
        });
    }
    next()
})
//  从db文件中导入的数据库模块
var mysql = require("../db/mysql")
// 我的首页
router.post('/shouye', (req, res) => {
    res.json({ msg: "我的首页", code: 1, data: [] })
})
// 我的-修改个人信息
// 信息修改:获取信息
router.get('/changeIfm/:id', (req, res) => {
    if (!req.params.id) {
        res.send({ code: -1, msg: '缺少参数', data: [] });
    }
    mysql.query(
        'SELECT * FROM users WHERE id = ?', [parseInt(req.params.id)],
        function (error, result) {
            // 响应数据 ,扁平化数组 Array.flat(1)
            // uname, utype, part, college, grade, speciality, mobile
            res.send({
                code: 0, msg: '查询数据',
                data: {
                    name: result[0].uname, department: result[0].pfpart, role: result[0].utype,
                    college: result[0].pfcollege, grade: result[0].pfgrade, major: result[0].pfspeciality,
                    phone: result[0].account
                }
            });
        }
    );
    // res.json({ msg: "我的-修改个人信息", code: 1, data: [] })
})
// 我的-修改个人信息
// 信息修改:保存信息 --- 优化
router.post('/save_changeIfm/:id', async (req, res) => {
    // 1. 参数验证
    const { id } = req.params;
    const { uname, utype, part, college, grade, speciality, mobile } = req.body;

    // 验证ID是否为有效数字
    if (!id || isNaN(Number(id))) {
        return res.status(400).json({
            code: 0,
            msg: "无效的用户ID",
            data: null
        });
    }

    // 验证必填字段
    if (!uname || !utype || !mobile) {
        return res.status(400).json({
            code: 0,
            msg: "姓名、用户类型和手机号为必填项",
            data: null
        });
    }

    // 验证手机号格式
    const mobileRegex = /^1[3-9]\d{9}$/;
    if (!mobileRegex.test(mobile)) {
        return res.status(400).json({
            code: 0,
            msg: "手机号格式不正确",
            data: null
        });
    }

    try {
        // 2. 使用参数化查询防止SQL注入
        const sql = 'UPDATE users SET uname=?, utype=?, pfpart=?, pfcollege=?, pfgrade=?, pfspeciality=?, account=? WHERE id=?';
        const params = [uname, utype, part, college, grade, speciality, mobile, id];

        // 3. 使用Promise封装数据库操作
        const result = await new Promise((resolve, reject) => {
            mysql.query(sql, params, (error, results) => {
                if (error) {
                    reject(error);
                } else {
                    resolve(results);
                }
            });
        });

        // 4. 检查是否实际更新了数据
        if (result.affectedRows === 0) {
            return res.status(404).json({
                code: 0,
                msg: "未找到指定用户或数据未变更",
                data: null
            });
        }

        // 5. 返回更新后的数据
        res.json({
            code: 1,
            msg: "个人信息更新成功",
            data: {
                id,
                uname,
                utype,
                part,
                college,
                grade,
                speciality,
                mobile
            }
        });

    } catch (error) {
        console.error('数据库操作失败:', error);

        // 6. 根据错误类型返回不同的错误信息
        let errorMsg = "服务器内部错误";
        if (error.code === 'ER_DUP_ENTRY') {
            errorMsg = "数据已存在，请勿重复提交";
        } else if (error.code === 'ER_NO_REFERENCED_ROW') {
            errorMsg = "关联数据不存在";
        }

        res.status(500).json({
            code: 0,
            msg: errorMsg,
            data: null
        });
    }
});

// 修改用户的头像和昵称
router.post('/mian_info_set', (req, res) => {
    let { id, avatar, uname } = req.body
    mysql.query('UPDATE users SET picture=?,uname=? WHERE id = ?',
        [avatar, uname, id], function () {
            // 响应信息
            res.json({ msg: "修改完毕", code: 1, data: { avatar, uname } })
        })
})

// 我的-修改密码
// 密码修改——获取数据
router.get('/changePwd/:id', (req, res) => {
    if (!req.params.id) {
        res.send({ code: -1, msg: '缺少参数', data: [] });
    }
    mysql.query(
        'SELECT * FROM users WHERE id = ?', [parseInt(req.params.id)],
        function (error, result) {
            // 响应数据 ,扁平化数组 Array.flat(1)
            res.send({ code: 0, msg: '密码修改——获取数据', data: { mobile: result[0].account } });
        }
    );
    // res.json({ msg: "我的-修改密码", code: 1, data: [] })
})
// 密码修改——保存数据
// 密码强度验证规则
const PASSWORD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}/;
router.post('/save_changePwd/:id', async (req, res) => {
    const { oldpassword, newpassword, enternew } = req.body;
    // 验证密码
    if (!PASSWORD_REGEX.test(newpassword)) {
        return response.status(400).json({ code: -1, msg: '密码必须包含大小写字母和数字，且长度至少8位', data: {} });
    }
    if (newpassword !== enternew) {
        return res.status(401).json({
            code: -1,
            msg: "两次填写密码不一致"
        })
    }
    // 使用 await 等待哈希完成
    const hashedPassword = await bcrypt.hash(newpassword, 10);
    mysql.query('SELECT pwd FROM users WHERE id = ?',
        [parseInt(req.params.id)],
        async function (error, result) {
            let pwd = result[0].pwd
            // console.log(result[0].pwd)
            // console.log(result)  [ RowDataPacket { pwd: '12345' } ]
            const passwordMatch = await bcrypt.compare(oldpassword, pwd);
            if (passwordMatch) {
                mysql.query('UPDATE users SET pwd=? WHERE id=?',
                    [hashedPassword, parseInt(req.params.id)], function () {
                        res.json({ msg: "修改完毕", code: 0 })
                    }
                )
            } else {
                res.send({ code: 1, msg: '原密码错误' })
            }
        }
    )
})
module.exports = router;
